1 Análise exploratória e visualização

1.1 Visualização e regularização

Para realizar a modelagem da série temporal do Ibovespa, será necessário realizar algumas análises anteriores, incluindo certos ajustes e eliminação de ruídos que permitam, ao mesmo tempo, um ajuste mais fácil e a manutenção das principais características da série para se ter uma predição mais acurada.

A visualização da ?@fig-dados_regularizados é da série de fechamento com dados até 01/02/2024. Este pequeno corte da série tem por objetivo, ao final do processo de modelagem, avaliar a capacidade preditiva do modelo “fora-da-amostra”, mas com a vantagem de se poder comparar as previsões com dados reais.

A série temporal também foi regularizada, uma vez que esta possui dados somente para os dias em que o pregão ocorreu (dias úteis). Como os modelos de séries temporais lidam melhor com dados regulares, foi aplicado um algoritmo de regularização para preencher as lacunas existentes.

Code
#|echo: false
#|message: false
#|warning: false
#|label: fig-dados_regularizados
#|fig-cap: 'Ibovespa - jan/2010 a fev/2024'

close_df <- ibovespa |> select(c(date, close)) |> filter(date < '2024-02-01')

close_reg <- close_df |> 
    pad_by_time(date, .by = "auto") |> 
    mutate_at(vars(close), .funs = ts_impute_vec, period = 1)
pad applied on the interval: day
Code
close_reg |> plot_time_series(date, close, .interactive = T, .plotly_slider = T, .title = 'Ibovespa regularizado')

O resultado também está na tabela ?@tbl-dados_regularizados.

Code
#|echo: false
#|message: false
#|warning: false
#|label: tbl-dados_regularizados
#|tbl-cap: ""
#|
# regularização para evitar descontinuidades por dias sem pregão


# imprime a tabela de dados
DT::datatable(close_reg, filter = "bottom", 
                          colnames = c("Data","Fechamento"),
                          # caption = header, 
                          extensions = 'Buttons', 
                          options = list(
                              dom = 'Bfrtip',
                              buttons = c('copy','excel', 'csv', 'pdf')
                          )) |>
                DT::formatDate(columns = c('date'), 'toLocaleDateString') |>
                DT::formatRound(columns = c('close'),
                                mark = ".",
                                dec.mark = ",") 

1.2 Caracterização do processo gerador de dados da série-temporal

1.2.1 Estacionariedade e decomposição

Um premissa fundamental da nossa modelagem é que a série será tratada como um processo univariado, ou seja, as suas características de interesse serão explicadas somente por ela mesma.

Neste sentido um bom primeiro passo para identificar quais seriam os modelos mais adequados, é determinar se a série é ou não estacionária.

1.2.1.1 Testes de raiz unitária

A estacionariedade é uma propriedade importante na análise de séries temporais. Um grande número de modelos assumem a estacionariedade do processo (como os modelos ARMA e ARIMA) e, além disso,um modelo de série temporal que não é estacionário irá variar a sua acurácia à medida que as métricas da série de tempo variarem1.

Assim, na análise de séries temporais é possível se utilizar de estratégias como a transformação logarítimica, a transformação quadrática ou ainda a diferenciação. Vale dizer que as duas primeiras buscam atacar a alteração da variância no tempo, enquanto que a última foca na remoção da tendência.

Para identificar a existência de raiz unitária, isto é, não estacionariedade, os testes que utilizaremos são: - Augmented Dickey-Fuller (ADF) - Hipótese nula (\(H_0\)): a série possui uma raiz unitária, logo não é estacionária2; - Kwiatkowski–Phillips–Schmidt–Shin (KPSS) - Hipótese nula (\(H_0\)): a série não possui uma raiz unitária, logo é estacionária3.

O resultado a seguir se referece à aplicação dos testes ADF e KPSS à série.

Code
#|echo: false
#|message: false
#|warning: false

close_ts <- ts(close_reg$close, start = c(2010,01,04), end = c(2024,02,01), frequency = 365)
Resultado do teste:
Code
ur_test(close_ts, type_adf = "trend", type_kpss = "tau")
############################
    
Resultado do Teste ADF
    
############################

    
p-valor: 0.878

Estatísticas do teste ADF (5% de significância):

           tau3     phi2     phi3
cvals -3.410000 4.680000 6.250000
stats -2.631176 3.020795 4.118092


############################
    
Resultado do Teste KPSS
    
############################

    
Valor crítico a 5% de significância: 0.146

Estatística do teste KPSS: 7.478

No teste ADF o p-valor mostra que a hipótese \(H_0\) não pode ser rejeitada considerando 5% de nível de significância - 0,878 > 0,05 e o módulo das estatísticas \(\tau_3\), \(\phi_2\) e \(\phi_3\) é menor que o módulo dos valores críticos. No teste KPSS o resultado indica que a hipótese \(H_0\) pode ser rejeitada a 5% de significância, visto que 7,582 > 0,146.

Os testes indicam, portanto, que a série não é estacionária.

1.2.2 Decomposição e testes de estacionariedade

1.2.3 Funções de autocorrelação (ACF) e autorrelação parcial (PACF)

A função de autocorrelação (ACF) e a função de autocorrelação parcial (PACF) são medidas de associação entre valores autais e valores pregressos em séries temporais[^exploratory_yearly-1]. Portanto, indicam em que medida um valor \(x_t\) é dependente do valor \(x_{t-1}\) e, consequentemente, o passado é últil para prever o futuro.

A autocorrelação parcial é mais útil durante o processo de especificação de um modelo autoregressivo. Ela ajuda a avaliar as propriedades de uma série temporal.

As funções de autocorrelação e autocorrelação parcial também servem para estudar a estacionariedade de uma série temporal[^exploratory_yearly-2].Uma série temporal estacionária tem funções de média, variância e autocorrelação que são essencialmente constantes ao longo do tempo[^exploratory_yearly-3]. A função de autocorrelação diminui para quase zero rapidamente para uma série temporal estacionária (decaimento exponencial).

Os modelos matemáticos mais comuns e que têm como premissa apresentar a estacionariedade são modelos auto-regressivos - AR (p), auto-regressivo e de média móvel - ARMA (p,q) - e modelo auto—regressivo integrado e de média móvel - ARIMA(p,d,q)[^exploratory_yearly-4].

Para uma série temporal estacionária, um modelo de média móvel vê o valor de uma variável no tempo \(t\) como uma função linear de erros residuais de \(q\) defasagens. Já um processo auto-regressivo de ordem \(p\) é um modelo que utiliza os próprios valores passados como preditores[^exploratory_yearly-5]. O termo \(d\) especifica a ordem de integração da série (ou seja, quantas vezes a série deve ser diferenciada para se tornar estacionária).

As ordens dos processos em termos de \(p\) e \(q\) são definidas com base na análise das funções de autocorrelação e autocorrelação parcial. A ordem \(p\) do processo auto-regressivo é determinada pela função de autocorrelação parcial, enquanto a ordem \(q\) do processo de média móvel é indicada pelo número de correlações estatisticamente significativas na função de autocorrelação[^exploratory_yearly-6].

Estabelecidos os conceitos e aplicações da ACF e da PACF, passemos à análise das séries de interesse.

Code
#|echo: false
#|message: false
#|warning: false
#|label: fig-acf_pacf
#|fig-cap: 'ACF e PACF'


ts_cor(close_ts, seasonal = T, lag.max = 30, seasonal_lags = 15)

A ACF mostra que existe uma autocorrelação persistente entre as defasagens da série temporal, a qual pode ser melhor visualizada no gráfico da ?@fig-acf para 7, 30, 60 e 90 defasagens.Com 60 defasagens a correlação já é menos forte. Também há a autocorrelação sazonal para 15 lags, a qual acompanha o comportamento da ACF. A PACF, por seu turno, indica que existe um processo do tipo AR(1), pois há um pico no primeiro lag.

Code
#|echo: false
#|message: false
#|warning: false
#|label: fig-acf
#|fig-cap: 'Relacionamento linear entre os lags 7, 30, 60 e 90'

# relacionamento linear entre os lags 7, 30, 60 e 90 dias
ts_lags(close_ts, lags = c(7, 30, 60, 90))

1.2.4 Decomposição da série, detecção de anomalias e changepoints

A existência de quebras estruturais4 nas séries temporais além de serem eventual causa de existência de raiz unitária (não estacionariedade), também podem auxiliar a compreensão do fenômeno analisado, vez que indicam a existência, por exemplo, de alterações na tendência da série e, deste modo, podem ajudar a corroborar hipóteses levantadas por quem está realizando a análise.

O primeiro passo para a detecção de anomalias é a decomposição da série em suas componentes de tendência e sazonalidade, além de podermos também verificar os resíduos das séries.

Os gráficos da Figure 1 mostra que existe um forte componente sazonal atuando e a tendência é crescente.

Figure 1: Decomposição da série temporal

Os gráficos da Figure 1 permitem identicar a existência de um componente sazonal importante na série, bem como resíduos relevantes por volta de 2020, mostra a magnitude do choque causado pela pandemia de Covid-19.

A Figure 2 mostra também mostra uma grande quantidade de anomalias identificadas no primeiro semestre de 2020, novamente um observação justificada pela pandemia, mais especificamente pelos lockdowns.

Figure 2: Detecção de anomalias - Ibovespa

Os dias em que foram identificadas as anomalidas estão na tabela Table 1.

Datas em que foram identificadas as anomalias
Data
2010-02-05
2010-05-20
2011-08-06
2011-08-07
2011-08-08
2011-08-09
2011-08-10
2018-05-16
2018-06-14
2018-06-15
2018-06-16
2018-06-17
2018-06-18
2018-06-21
2018-06-22
2018-06-23
2018-06-24
2018-06-27
2018-12-25
2018-12-26
2018-12-27
2019-05-16
2019-05-17
2019-05-18
2019-08-24
2019-08-25
2019-08-26
2019-08-27
2019-10-08
2020-02-12
2020-02-17
2020-02-18
2020-02-19
2020-02-20
2020-03-07
2020-03-08
2020-03-09
2020-03-10
2020-03-11
2020-03-12
2020-03-13
2020-03-14
2020-03-15
2020-03-16
2020-03-17
2020-03-18
2020-03-19
2020-03-20
2020-03-21
2020-03-22
2020-03-23
2020-03-24
2020-03-25
2020-03-26
2020-03-27
2020-03-28
2020-03-29
2020-03-30
2020-03-31
2020-04-01
2020-04-02
2020-04-03
2020-04-04
2020-04-05
2020-04-06
2020-04-07
2020-05-12
2020-05-13
2020-05-15
2020-05-16
2020-06-05
2020-06-06
2020-06-07
2020-06-08
2020-06-09
2020-09-29
2020-10-28
2020-10-29
2020-10-30
2020-10-31
2020-11-01
2020-11-02
2020-11-03
2020-11-04
2021-01-08
2021-01-09
2021-01-10
2021-01-11
2021-01-12
2021-01-14
2021-02-26
2021-02-27
2021-02-28
2021-03-01
2021-03-02
2021-03-03
2021-03-08
2021-03-09
2021-09-20
2021-10-15
2021-10-16
2021-10-17
2021-10-18
2022-01-05
2022-01-06
2022-01-08
2022-01-09
2022-01-10
2022-03-15
2022-03-24
2022-03-25
2022-03-26
2022-03-27
2022-03-28
2022-03-29
2022-03-30
2022-03-31
2022-04-01
2022-04-02
2022-04-03
2022-04-04
2022-04-05
2022-04-06
2022-04-07
2022-04-08
2022-04-09
2022-04-10
2022-04-11
2022-05-09
2022-05-10
2022-05-24
2022-05-25
2022-05-26
2022-05-27
2022-05-28
2022-05-29
2022-05-30
2022-05-31
2022-06-01
2022-06-02
2022-06-03
2022-06-04
2022-06-05
2022-06-06
2022-06-07
2022-06-08
2022-07-14
2022-07-15
2022-07-16
2022-07-17
2022-07-18
2022-08-12
2022-08-13
2022-08-14
2022-08-15
2022-08-16
2022-08-17
2022-08-18
2022-09-29
2022-10-21
2022-10-22
2022-11-04
2022-12-13
2022-12-14
2022-12-15
2022-12-16
2022-12-17
2022-12-18
2023-01-03
2023-03-23
2023-10-22
2023-10-23
2023-10-25
2023-10-27
2023-10-28
2023-10-29
2023-10-30
2023-10-31
2023-12-27
2023-12-28
Table 1: Datas em que foram identificadas as anomalias.

Podemos também comparar as datas em que foram identificadas as anomalias pelo algoritmo anterior, com os “pontos de quebra” (ou de mudança) identificados pelo modelo Prophet.

Figure 3: Changepoints (pontos de quebra) identificados via Prophet

Os dias em que foram identificados changepoints estão na tabela Table 2.

Datas em que foram identificados os `changepoints`
Data
2010-07-18
2011-01-30
2011-08-13
2012-02-24
2012-09-06
2013-03-21
2013-10-02
2014-04-15
2014-10-28
2015-05-11
2015-11-22
2016-06-04
2016-12-17
2017-06-30
2018-01-11
2018-07-25
2019-02-06
2019-08-20
2020-03-02
2020-09-14
2021-03-28
2021-10-09
2022-04-22
2022-11-04
2023-05-18
Table 2: Datas em que foram identificados os changepoints.

Uma forma de melhor visualizar o período mais crítico para a modelagem, ou seja, o período em que existe maior concentração de volatilidade e mudanças de tendência, é por meio do histograma a seguir.

Figure 4: Histograma de changepoints e anomalias.

As anomalias/changepoints estão relacionados essencialmente concentrados 2020 e 2022. Em 2020 tivemos a pandemia de Covid-19, enquanto que em 2022 tivemos eleições gerais, inclusive para Presidente da República. Tais eventos podem ajudar a explicar a grande quantidade de dados considerados anômalos.

Figure 5: Série temporal com dados observados e após eliminação de anomalias

Tendo em vista que a série “limpa” possui menor quantidade de valores extremos, esta será, portanto, aquela que tomaremos como base para realizar a nossa modelagem e previsão.

Footnotes

  1. Nielsen, Aileen.Practical Time Series Analysis: Prediction with Statistics and Machine Learning.O’Reilly Media; 1ª edição (19 novembro 2019).pp.85↩︎

  2. https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test↩︎

  3. https://en.wikipedia.org/wiki/KPSS_test↩︎

  4. https://en.wikipedia.org/wiki/Structural_break#:~:text=Structural%20break%20tests,-A%20single%20break&text=For%20linear%20regression%20models%2C%20the,…%2CT%5D.↩︎